package com.taldh.design.patterns.proxy.dynamic;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * date 2020/6/23
 *
 * @author 袁小黑
 * @version 1.0.0
 **/

public class CglibProxyTest {

    public static class B {

        public int test() {
            System.out.println("This is B");
            return 1;
        }
    }

    public static void main(String[] args) {
        //System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/donghaoyuan/workspaces/IdeaProjects/leetcode/src/main/java/com/taldh/design/patterns/proxy/dynamic");
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(B.class);
        enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) -> {
            System.out.println("调用的方法是："+method.getName());
            //Object o = method.invoke(obj, args); //这个method已经变了，如果直接调用method.invoke，会出现异常。
            Object o = proxy.invokeSuper(obj, args1);
            System.out.println("调用之后结果："+o);
            return o;
        });
        B o = (B)enhancer.create();
        o.test();
    }

    // 从生成的class数量来看，cglib比较重。功能特别多。
    // FastClass是Cglib实现的一种通过给方法建立下标索引来访问方法的策略，为了绕开反射。
    //上面的描述代表MethodPeoxy可以根据对方法建立索引调用方法，而不需要使用传统Method的invoke反射调用，提高了性能，
    // 当然额外的得多生成一些类信息,比如在最开始的代理类中我们也可以看到MethodProxy也是有通过索引来做的。

}
